static const ClutterColor default_color = { 0x00, 0x00, 0x00, 0xff };
+static void shell_tray_manager_release_resources (ShellTrayManager *manager);
+
static void na_tray_icon_added (NaTrayManager *na_manager, GtkWidget *child, gpointer manager);
static void na_tray_icon_removed (NaTrayManager *na_manager, GtkWidget *child, gpointer manager);
{
manager->priv = shell_tray_manager_get_instance_private (manager);
- manager->priv->na_manager = na_tray_manager_new ();
-
- manager->priv->icons = g_hash_table_new_full (NULL, NULL,
- NULL, free_tray_icon);
manager->priv->bg_color = default_color;
-
- g_signal_connect (manager->priv->na_manager, "tray-icon-added",
- G_CALLBACK (na_tray_icon_added), manager);
- g_signal_connect (manager->priv->na_manager, "tray-icon-removed",
- G_CALLBACK (na_tray_icon_removed), manager);
}
static void
{
ShellTrayManager *manager = SHELL_TRAY_MANAGER (object);
- g_object_unref (manager->priv->na_manager);
- g_hash_table_destroy (manager->priv->icons);
+ shell_tray_manager_release_resources (manager);
G_OBJECT_CLASS (shell_tray_manager_parent_class)->finalize (object);
}
return g_object_new (SHELL_TYPE_TRAY_MANAGER, NULL);
}
+static void
+shell_tray_manager_ensure_resources (ShellTrayManager *manager)
+{
+ if (manager->priv->na_manager != NULL)
+ return;
+
+ manager->priv->icons = g_hash_table_new_full (NULL, NULL,
+ NULL, free_tray_icon);
+
+ manager->priv->na_manager = na_tray_manager_new ();
+
+ g_signal_connect (manager->priv->na_manager, "tray-icon-added",
+ G_CALLBACK (na_tray_icon_added), manager);
+ g_signal_connect (manager->priv->na_manager, "tray-icon-removed",
+ G_CALLBACK (na_tray_icon_removed), manager);
+}
+
+static void
+shell_tray_manager_release_resources (ShellTrayManager *manager)
+{
+ g_clear_object (&manager->priv->na_manager);
+ g_clear_pointer (&manager->priv->icons, g_hash_table_destroy);
+}
+
static void
shell_tray_manager_style_changed (StWidget *theme_widget,
gpointer user_data)
shell_tray_manager_manage_screen (ShellTrayManager *manager,
StWidget *theme_widget)
{
+ shell_tray_manager_ensure_resources (manager);
+
na_tray_manager_manage_screen (manager->priv->na_manager);
g_signal_connect_object (theme_widget, "style-changed",